#!/usr/bin/python3
a, b, c, d = 20, 5.5, True, 4+3j
print(type(a), type(b), type(c), type(d))
print(isinstance(a, int))
# 数值运算
print(5 + 4)  # 加法
print(4.3 - 2)  # 减法
print(3 * 7)  # 乘法
print(2 / 4)  # 除法，得到一个浮点数
print(2 // 4)  # 除法，得到一个整数
print(17 % 3)  # 取余
print(2 ** 5)  # 乘方
# String（字符串）
# 加号 + 是字符串的连接符， 星号 * 表示复制当前字符串，与之结合的数字为复制的次数。
str = 'Daniel'
print(str)          # 输出字符串
print(str[0:-1])    # 输出第一个到倒数第二个的所有字符
print(str[0])       # 输出字符串第一个字符
print(str[2:5])     # 输出从第三个开始到第五个的字符
print(str[2:])      # 输出从第三个开始的后的所有字符
print(str * 2)      # 输出字符串两次，也可以写成 print (2 * str)
print(str + "TEST")  # 连接字符串

# 使用反斜杠 \ 转义特殊字符，如果你不想让反斜杠发生转义，可以在字符串前面添加一个 r，表示原始字符串：
print('Daniel\nDaniel')
print(r'Daniel\nDaniel')

# List(列表)
# 加号 + 是列表连接运算符，星号 * 是重复操作。
list = ['abcd', 786, 2.23, 'daniel', 70.2]
tinylist = [123, 'daniel']
print(list)            # 输出完整列表
print(list[0])         # 输出列表第一个元素
print(list[1:3])       # 从第二个开始输出到第三个元素
print(list[2:])        # 输出从第三个元素开始的所有元素
print(tinylist * 2)    # 输出两次列表
print(list + tinylist)  # 连接列表
# 与Python字符串不一样的是，列表中的元素是可以改变的：
list[2]=123
print(list)
list[2:3]=[] # 将对应的元素值设置为 []
print(list)
# List 内置了有很多方法，例如 append()、pop() 等等
# 列表截取可以接收第三个参数，参数作用是截取的步长，
aList = [1,2,"s","f","r",4,'z','w','tr',7]
print(aList[1:6:2])
# 如果第三个参数为负数表示逆向读取，以下实例用于翻转字符串：
def reverseWords(input):
     
    # 通过空格将字符串分隔符，把各个单词分隔为列表
    inputWords = input.split(" ")
 
    # 翻转字符串
    # 假设列表 list = [1,2,3,4],  
    # list[0]=1, list[1]=2 ，而 -1 表示最后一个元素 list[-1]=4 ( 与 list[3]=4 一样)
    # inputWords[-1::-1] 有三个参数
    # 第一个参数 -1 表示最后一个元素
    # 第二个参数为空，表示移动到列表末尾
    # 第三个参数为步长，-1 表示逆向
    inputWords=inputWords[-1::-1]
 
    # 重新组合字符串
    output = ' '.join(inputWords)
     
    return output
 
if __name__ == "__main__":
    input = 'I like daniel'
    rw = reverseWords(input)
    print(rw)

# Tuple（元组）
#!/usr/bin/python3

tuple = ( 'abcd', 786 , 2.23, 'Daniel', 70.2  )
tinytuple = (123, 'Daniel')
print (tuple)             # 输出完整元组
print (tuple[0])          # 输出元组的第一个元素
print (tuple[1:3])        # 输出从第二个元素开始到第三个元素
print (tuple[2:])         # 输出从第三个元素开始的所有元素
print (tinytuple * 2)     # 输出两次元组
print (tuple + tinytuple) # 连接元组
print(tuple[1:5])
# 构造包含 0 个或 1 个元素的元组比较特殊，所以有一些额外的语法规则：
tup1 = ()    # 空元组
tup2 = (20,) # 一个元素，需要在元素后添加逗号

# Set（集合）
#!/usr/bin/python3
sites = {'Google', 'Taobao', 'Daniel', 'Facebook', 'Zhihu', 'Baidu', 'Daniel'}
print(sites)   # 输出集合，重复的元素被自动去掉
# 成员测试
if 'Daniel' in sites :
    print('Daniel 在集合中')
else :
    print('Daniel 不在集合中')
# set可以进行集合运算
a = set('abracadabra')
b = set('alacazam')
print(a)
print(a - b)     # a 和 b 的差集
print(a | b)     # a 和 b 的并集
print(a & b)     # a 和 b 的交集
print(a ^ b)     # a 和 b 中不同时存在的元素

# Dictionary（字典）
#!/usr/bin/python3
dict = {}
dict['one'] = "1 - 菜鸟教程"
dict[2]     = "2 - 菜鸟工具"
tinydict = {'name': 'runoob','code':1, 'site': 'www.runoob.com'}
print (dict['one'])       # 输出键为 'one' 的值
print (dict[2])           # 输出键为 2 的值
print (tinydict)          # 输出完整的字典
print (tinydict.keys())   # 输出所有键
print (tinydict.values()) # 输出所有值
# 构造函数 dict() 可以直接从键值对序列中构建字典
